home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / dev / mui / muiplusp.lha / Examples / TListview.cpp < prev    next >
C/C++ Source or Header  |  1997-03-23  |  6KB  |  197 lines

  1. /* Simple example and test program to demonstrate use of template Listview
  2.    class */
  3.  
  4. #define MUIPP_DEBUG         // Turn debugging mode on for invalid use of classes
  5. //#define MUIPP_NOINLINES       // No inlines makes code compile quicker but the resulting
  6.                             // executable is larger and slower. Best to use this
  7.                             // option when developing and turn off for final release.
  8. #define MUIPP_TEMPLATES     // Allows use of MUI template classes
  9.  
  10. // This is the main C++ header file
  11.  
  12. #include <libraries/mui.hpp>
  13.  
  14. #include <inline/exec.h>
  15.  
  16. // These objects are inserted directly into the listview. Using template
  17. // listview means that the objects are retrieved and inserted as Person
  18. // objects (ie there is no need to convert to/from void *).
  19.  
  20. class Person
  21. {
  22. public:
  23.     Person (const char *_name)
  24.     {
  25.         name = (char *)_name;
  26.     }
  27.  
  28.     char *name;
  29. };
  30.  
  31. typedef ULONG (*HookFunction)();
  32.  
  33. struct IntuitionBase *IntuitionBase = NULL;
  34. struct Library *MUIMasterBase = NULL;
  35.  
  36. // Hook function to display Person object in listview
  37.  
  38. void
  39. DisplayPerson (void)
  40. {
  41.     register Person *a1 asm("a1"); Person *person = a1;
  42.     register char **a2 asm("a2"); char **column = a2;
  43.  
  44.     column[0] = person->name;
  45. }
  46.  
  47. struct Hook displayHook = {{NULL, NULL}, (HookFunction)DisplayPerson, NULL, NULL};
  48.  
  49. // Although the listview is passed by value it is actually passed by reference
  50. // always. This is because the class is only a wrapper to the BOOPSI class
  51. // and only has one attribute - the BOOPSI object pointer. Hence, it is the
  52. // equivalent of passing an Object * on the stack.
  53.  
  54. void
  55. PrintPersonList (CTMUI_Listview<Person> list)
  56. {
  57.     // You can use Length() or Entries() to get the length of a list
  58.  
  59.     int numPeople = list.Length();
  60.  
  61.     printf ("Number of people in list = %d\n", numPeople);
  62.  
  63.     // You can treat Listviews just like arrays!!
  64.  
  65.     for (int i = 0; i < numPeople; i++)
  66.     {
  67.         printf ("%d %s\n", i, list[i].name);
  68.     }
  69. }
  70.  
  71. int
  72. main (void)
  73. {
  74.     // Open libraries required
  75.  
  76.     if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary ("intuition.library", 0)) == NULL)
  77.     {
  78.         printf ("Could not open intuition.library\n");
  79.         return 10;
  80.     }
  81.  
  82.     if ((MUIMasterBase = OpenLibrary ("muimaster.library", 0)) == NULL)
  83.     {
  84.         printf ("Could not open muimaster.library\n");
  85.         return 10;
  86.     }
  87.  
  88.     // Declare template Listview of type Person to display list of people
  89.     // NOTE: This does no initialization, it's just a declaration.
  90.  
  91.     CTMUI_Listview<Person> list;
  92.  
  93.     CMUI_Window window;
  94.  
  95.     // Create Application object. I am not using any shortcuts here to create
  96.     // the objects. I actually prefer the layout like this than when using
  97.     // shortcuts. If you prefer the old way of creating objects by using the
  98.     // shortcuts then you can still do this. See the shortcuts.cpp example
  99.     // for details as some shortcuts have had to change name so as not to clash
  100.     // with class member functions.
  101.  
  102.     CMUI_Application app
  103.     (
  104.         MUIA_Application_Title,         "TListview",
  105.         MUIA_Application_Author,        "Nicholas Allen",
  106.         MUIA_Application_Base,          "TEST",
  107.         MUIA_Application_Copyright,     "AllenSoft",
  108.         MUIA_Application_Description,   "Test Program For Template Listview class",
  109.         MUIA_Application_Version,       "$VER: Test 1.0 (17.9.96)",
  110.         SubWindow, window = CMUI_Window
  111.         (
  112.             MUIA_Window_Title, "Test Program For Template Listview class",
  113.             MUIA_Window_ID, 10,
  114.             WindowContents, CMUI_VGroup
  115.             (
  116.                 Child, list = CTMUI_Listview<Person>
  117.                 (
  118.                     MUIA_Listview_List, CMUI_List
  119.                     (
  120.                         MUIA_List_DisplayHook, &displayHook,
  121.                         InputListFrame,
  122.                         TAG_DONE
  123.                     ),
  124.                     MUIA_CycleChain, 1,
  125.                     MUIA_ShortHelp, "Listview created using templates!!",
  126.                     TAG_DONE
  127.                 ),
  128.                 TAG_DONE
  129.             ),
  130.             TAG_DONE
  131.         ),
  132.         TAG_DONE        // Don't forget these if you're not using shortcuts!
  133.     );
  134.  
  135.     // Any MUI object created as a C++ class can be tested for validity by
  136.     // calling its IsValid() method. This method just checks that the
  137.     // BOOPSI object pointer is not NULL.
  138.  
  139.     if (!app.IsValid())
  140.     {
  141.         printf ("Could not create application!\n");
  142.         return 10;
  143.     }
  144.  
  145.     // Insert some new people into the listview!!
  146.  
  147.     list.InsertBottom(new Person ("Nick"));
  148.     list.InsertBottom(new Person ("Dom"));
  149.     list.InsertBottom(new Person ("Mart"));
  150.     list.InsertBottom(new Person ("Nicky"));
  151.  
  152.     // This only copies 4 bytes onto stack!! It is the same as passing a
  153.     // BOOPSI Object *
  154.  
  155.     PrintPersonList (list);
  156.  
  157.     // Setup close window notification.
  158.     // Because Notify() is a variable args method we have to pass sva as the
  159.     // first parameter. Failing to do this will result in an error at
  160.     // COMPILE time so there won't be any weird crashes by forgetting to do
  161.     // this.
  162.  
  163.     window.Notify(sva, MUIA_Window_CloseRequest, TRUE,
  164.                   app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  165.  
  166.     window.SetOpen(TRUE);
  167.  
  168.     ULONG sigs = 0;
  169.     BOOL running = TRUE;
  170.  
  171.     while (running)
  172.     {
  173.         switch (app.NewInput(&sigs))
  174.         {
  175.             case MUIV_Application_ReturnID_Quit:
  176.                 running = FALSE;
  177.             break;
  178.         }
  179.  
  180.         if (sigs)
  181.         {
  182.             sigs = Wait (sigs | SIGBREAKF_CTRL_C);
  183.             if (sigs & SIGBREAKF_CTRL_C) break;
  184.         }
  185.     }
  186.  
  187.     // This disposes of the application and all windows and objects in the
  188.     // windows.
  189.  
  190.     app.Dispose();
  191.  
  192.     CloseLibrary ((struct Library *)IntuitionBase);
  193.     CloseLibrary (MUIMasterBase);
  194.  
  195.     return 0;
  196. }
  197.